﻿using System;

namespace Sgr.Identity.Services
{
    /// <summary>
    /// UPMS系统密码哈希服务实现类
    /// 使用BCrypt算法进行密码的哈希和验证
    /// </summary>
    public class UpmsPasswordHashService : IPasswordHashService
    {
        #region 常量定义

        /// <summary>
        /// BCrypt工作因子
        /// 值越大，哈希计算越慢，安全性越高
        /// 推荐值范围：10-12，默认使用12
        /// </summary>
        private const int WORK_FACTOR = 12;

        #endregion 常量定义

        #region IPasswordHashService 实现

        /// <summary>
        /// 对密码进行哈希处理
        /// </summary>
        /// <param name="password">原始密码</param>
        /// <returns>哈希后的密码字符串</returns>
        /// <exception cref="ArgumentNullException">密码为空时抛出</exception>
        public string HashPassword(string password)
        {
            Check.StringNotNullOrEmpty(password, nameof(password));

            return BCrypt.Net.BCrypt.HashPassword(password, WORK_FACTOR);
        }

        /// <summary>
        /// 验证密码是否匹配
        /// </summary>
        /// <param name="password">要验证的原始密码</param>
        /// <param name="hashedPassword">已存储的哈希密码</param>
        /// <returns>密码是否匹配</returns>
        public bool VerifyPassword(string password, string hashedPassword)
        {
            // 如果密码或哈希值为空，直接返回false
            if (string.IsNullOrEmpty(password) || string.IsNullOrEmpty(hashedPassword))
            {
                return false;
            }

            try
            {
                return BCrypt.Net.BCrypt.Verify(password, hashedPassword);
            }
            catch
            {
                // BCrypt验证失败时返回false
                return false;
            }
        }

        #endregion IPasswordHashService 实现
    }
}